#!/usr/bin/env node

const { exec } = require("child_process");
const fs = require("fs").promises;
const path = require("path");

// Gitee仓库配置
const GITEE_REPO = "https://gitee.com/syysmq/iptv-live";
const FILE_NAME = "ipv6.m3u";
const FILE_URL = `${GITEE_REPO}/raw/master/${FILE_NAME}`;

// Git用户配置 - 可根据需要修改
const GIT_USER = {
  name: "syysmq",
  email: "82216664@qq.com"
};

async function execCommand(cmd) {
  return new Promise((resolve) => {
    exec(cmd, (err, stdout, stderr) => resolve([err, stdout, stderr]));
  });
}

async function fileExists(filePath) {
  try {
    await fs.access(filePath);
    return true;
  } catch {
    return false;
  }
}

/**
 * 配置Git用户信息
 * 确保Git提交时有正确的用户名和邮箱
 */
async function configureGitUser() {
  console.log("配置Git用户信息...");
  await execCommand(`git config user.name "${GIT_USER.name}"`);
  await execCommand(`git config user.email "${GIT_USER.email}"`);
  // 启用凭证存储
  await execCommand("git config credential.helper store");
}

async function syncToGitee() {
  try {
    console.log("正在验证本地文件...");
    
    // 检查本地文件是否存在
    if (!(await fileExists(FILE_NAME))) {
      throw new Error(`文件 ${FILE_NAME} 不存在`);
    }

    console.log("初始化Git环境...");
    
    // 初始化仓库
    const [statusErr] = await execCommand("git status");
    if (statusErr) {
      await execCommand("git init");
      const [remoteErr] = await execCommand(`git remote add origin ${GITEE_REPO}.git`);
      if (remoteErr) {
        await execCommand(`git remote set-url origin ${GITEE_REPO}.git`);
      }
      
      // 配置Git用户信息
      await configureGitUser();
    }

    // 强制同步远程仓库
    console.log("同步远程更改...");
    await execCommand("git fetch --all");
    await execCommand("git reset --hard origin/master");
    
    // 覆盖文件
    console.log("更新文件内容...");
    const localContent = await fs.readFile(FILE_NAME, "utf-8");
    await fs.writeFile(FILE_NAME, localContent.trim() + "\n");  // 确保文件末尾换行

    // 提交更改
    console.log("创建提交...");
    await execCommand(`git add ${FILE_NAME}`);
    const date = new Date().toLocaleString("zh-CN");
    const [commitErr, commitStdout, commitStderr] = await execCommand(`git commit --allow-empty -m "自动同步直播源 ${date}"`);
    
    if (commitErr && !commitStderr.includes("nothing to commit")) {
      // 如果提交失败，尝试配置Git用户信息后重试
      await configureGitUser();
      const [retryErr, retryStdout, retryStderr] = await execCommand(`git commit --allow-empty -m "自动同步直播源 ${date}"`);
      
      if (retryErr && !retryStderr.includes("nothing to commit")) {
        throw new Error(`提交失败: ${retryStderr || retryErr.message}`);
      }
    }

    // 强制推送更新
    console.log("推送至Gitee...");
    const [pushErr, pushStdout, pushStderr] = await execCommand("git push -f origin master");
    
    if (pushErr) {
      if (pushStderr.includes("Authentication")) {
        console.log(`
          认证失败！请先配置Git凭证：
          1. 设置用户信息：
          git config --global user.name "syysmq"
          git config --global user.email "82216664@qq.com"

          2. 启用凭证存储：
          git config --global credential.helper store

          已尝试自动配置本地仓库的用户信息，但远程认证仍然失败。
          请确保您已正确配置Gitee的访问凭证。
        `);
      }
      throw new Error(`推送失败: ${pushStderr}`);
    }

    console.log("同步成功！文件地址：", FILE_URL);
    return true;
  } catch (error) {
    console.error("操作失败:", error.message);
    return false;
  }
}

// 执行同步前先配置Git环境
async function main() {
  try {
    // 先配置Git用户信息
    await configureGitUser();
    
    // 执行同步
    const success = await syncToGitee();
    process.exit(success ? 0 : 1);
  } catch (error) {
    console.error("执行失败:", error.message);
    process.exit(1);
  }
}

// 启动主程序
main();